<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>数组</title>
</head>
<body>
<script>

    //模拟数组的push方法

    // var arr = [];
    // Object.prototype.push = function () {
    //     for (var i=0; i<arguments.length; i++){
    //         this[this.length] = arguments[i];
    //     }
    //     return this.length;
    // };
    // arr.push(1,2,3);
    // console.log(arr);

    //pop方法 把数组的最后一位剪切出去

    //shift方法 是在数组前面减去数组

    //unshift方法 是在数组前面添加数组


    //splice方法 arr.splice(是从第几位开始,截取多少长度，在切口处添加新的数据(可以随便放多少个))

/*
    var arr = [1,2,3,4,5];
    console.log(arr);//[1, 2, 3, 4, 5]
    var ret = arr.splice(1,2);
    console.log(ret);//[2, 3]  切掉了[2,3]
    console.log(arr);//[1, 4, 5]
    var arra = ["a","b","c","d","e"];
    arra.splice(3,2,"添加1","添加2","添加3","添加....");
    console.log(arra);
    //["a", "b", "c", "添加1", "添加2", "添加3", "添加...."]

    //用splice向num数组添加4
    var num = [1,2,3,5];
    num.splice(2,0,4);
    console.log(num);// [1, 2, 4, 3, 5]
    num.splice(-1,1,"三");
    console.log(num);//[1, 2, 4, 3, "三", 5]

*/

/*
    分析：
    num.splice(-1,1,"三");// -1 是指数组的倒数第一位

    splice = function (pos){
        pos += pos > 0 ? 0 : this.length;
    }

 */


    //sort方法是给数组排序的

    // var num = [1,10,2,5,3];
    // var sortnum = num.sort();
    // console.log(sortnum);// [1, 10, 2, 3, 5]  默认是按字符串来排序的

    //实现数组排序

    // var num = [1,56,5,9,4,2,3,7,6];
    // var ret1 = num.sort(function (a,b) {
    //     return a - b;//升序
    // });
    // console.log(ret1);//[1, 2, 3, 4, 5, 6, 7, 9, 56]
    // var ret2 = num.sort(function (a,b) {
    //     return b - a;//降序
    // });
    // console.log(ret2);//[56, 9, 7, 6, 5, 4, 3, 2, 1]



/*

分析升序和降序
var arr = [5,9,4,2,3,7];
arr.sort(function (a,b){
    //升序
    // if(a -b > 0){ //if(a>b)
    //     return 1;
    //     //return a - b;
    // }else {
    //     return -1;
    //     //return a - b;
    // }
    return a - b;
})

arr.sort(function (a,b){
    //降序
    // if(a -b < 0){//if(a<b)
    //     return 1;
    //     //return b - a;
    // }else {
    //     return -1;
    //     //return b - a;
    // }
    //return b - a;
})

 */



    //给有序的数组乱数

    // var num = [1,2,3,4,5,6,7];
    // num.sort(function () {
    //     return Math.random() - 0.5;
    // })


/*

    //排列对象群

    var deng = {
        name : "deng",
        age : 18,
        sex : "male",
        face : "handsome"
    };
    var ji = {
        name : "ji",
        age : 20,
        sex : undefined,
        face : "amazing"
    };
    var zhang = {
        name : "zhang",
        age : 40,
        sex : "female",
        face : "ugly"
    };

    var arr = [deng,ji,zhang];

    //1.按照年龄升序
    arr.sort(function (a,b) {
        // if(a.age > b.age){
        //     return 1;
        // }else {
        //     return -1;
        // }
        return a.age - b.age;
    });
    console.log(arr);
    // 0: {name: "deng", age: 18, sex: "male", face: "handsome"}
    // 1: {name: "ji", age: 20, sex: undefined, face: "amazing"}
    // 2: {name: "zhang", age: 40, sex: "female", face: "ugly"}


 */


    //按字符串长度排序

    // var arr = ["aa","bbb","cccc","d","kk","djhcsjdhkj","kel","gdgcd","s","kll","d"];
    // arr.sort(function (a,b) {
    //     return a.length - b.length;
    // });
    // console.log(arr);// ["d", "s", "d", "aa", "kk", "bbb", "kel", "kll", "cccc", "gdgcd", "djhcsjdhkj"]



    //按字节长度来排序

    // var arr = ["aa","b喊bb","cccc","哈哈哈d","kk","dj哈哈hcsjdhkj","kel","gdgcd","我是你的不不不三次刹车","kll","d"];
    // function retBytesLen(str) {
    //     var len = str.length;
    //     for (var i=0; i<len; i++){
    //         if (str.charCodeAt(i) > 255){
    //             len ++;
    //         }
    //     }
    //     return len;
    // }
    // arr.sort(function (a,b) {
    //     return retBytesLen(a) - retBytesLen(b);
    // });
    // console.log(arr);//["d", "aa", "kk", "kel", "kll", "cccc", "b喊bb", "gdgcd", "哈哈哈d", "dj哈哈hcsjdhkj", "我是你的不不不三次刹车"]



    // var arr = [1,2,3,4,5,6,7,8];
    // var newArr = arr.slice(3,5);
    // console.log(newArr);//(2) [4, 5]
    // var newArr1 = arr.join("-");
    // console.log(newArr1);//1-2-3-4-5-6-7-8
    // // var newArr3 = arr.split("-");
    // // console.log(newArr1);



    //将字符串链接在一起

    // var str = "a";
    // var str1 = "b";
    // var str2 = "c";
    // var str3 = "d";
    // var str4 = "e";
    // var str5 = "f";
    // var str6 = "g";
    // var arr = [str,str1,str2,str3,str4,str5,str6];
    // arr.join("-");





//    类数组

    // function test() {
    //     console.log(arguments);
    //     //arguments.push(7);//报错arguments.push is not a function at test
    // }
    // test(1,2,3,4,5,6);
    //
    // //这就叫类数组
    // var obj = {
    //     "0" : "a",
    //     "1" : "b",
    //     "2" : "c",
    //     "length" : 3,
    //     "push" : Array.prototype.push,
    //     "splice" : Array.prototype.splice
    // };
    // console.log(obj);//{0: "a", 1: "b", 2: "c", length: 3, push: ƒ}//加了splice后["a", "b", "c", push: ƒ, splice: ƒ]
    // obj.push(4);
    // console.log(obj);//{0: "a", 1: "b", 2: "c", 3: 4, length: 4, push: ƒ}//加了splice后 ["a", "b", "c", 4, push: ƒ, splice: ƒ]

//    属性要为索引属性，必须有length属性，最好加上push
//     Array.prototype.push = function (target) {
//         this[this.length] = target;
//         this.length ++;
//     }



    //题目  下面的代码运行后 obj长什么样？

    // var obj = {
    //     "2" : "a",
    //     "3" : "b",
    //     "length" : 2,
    //     "push" : Array.prototype.push
    // };
    // obj.push("c");
    // obj.push("d");
    // // obj ?
    // console.log(obj);//{2: "c", 3: "d", length: 4, push: ƒ}  ???
    // //2: "c", 和 3: "d", length: 4, 都改变了

    //分析：

    // Array.prototype.push = function (target) {
    //     this[this.length] = target;
    //     this.length ++;
    // }

    // obj.push("c");
    // Array.prototype.push = function (c) {
    //     obj[obj.length] = c;   //obj[2] = c
    //     obj.length ++;   //length = 3
    // }

    // obj.push("d");
    // Array.prototype.push = function (d) {
    //     obj[obj.length] = d;   //obj[3] = d
    //     obj.length ++;   //length = 4
    // }

    //以上操作就会把前面的覆盖掉


//    类数组：又像数组又像对象


//     var arr = {
//         "0" : "a",
//         "1" : "b",
//         "2" : "c",
//         length : 3,
//         name : "hanyun",
//         age : 18,
//         sex : "male",
//         push : Array.prototype.push,
//         splice : Array.prototype.splice
//     };
//     console.log(arr);//["a", "b", "c", name: "hanyun", age: 18, sex: "male", push: ƒ, splice: ƒ]
//
//     for (var prop in arr){
//         console.log(arr[prop]);
//     }



</script>

</body>
</html>
